+Fri Mar 22 10:56:19 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkaccelmap.c (gtk_accel_map_save_fd): Fix memory
+ leak. (#74400, Morten Welinder.)
+
+ * gtk/gtkaccelmap.c: Properly handle short returns from
+ write() calls. (Handling EINTR isn't enough... that only
+ handles the case where you were interrupted before you
+ wrote a single byte.)
+
+ * gdk/linux-fb/gdkmouse-fb.c gdk/linux-fb/gdkkeyboard-fb.c:
+ Robustify against short returns from write() calls.
+
Fri Mar 22 10:12:10 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_paint): Change
+Fri Mar 22 10:56:19 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkaccelmap.c (gtk_accel_map_save_fd): Fix memory
+ leak. (#74400, Morten Welinder.)
+
+ * gtk/gtkaccelmap.c: Properly handle short returns from
+ write() calls. (Handling EINTR isn't enough... that only
+ handles the case where you were interrupted before you
+ wrote a single byte.)
+
+ * gdk/linux-fb/gdkmouse-fb.c gdk/linux-fb/gdkkeyboard-fb.c:
+ Robustify against short returns from write() calls.
+
Fri Mar 22 10:12:10 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_paint): Change
+Fri Mar 22 10:56:19 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkaccelmap.c (gtk_accel_map_save_fd): Fix memory
+ leak. (#74400, Morten Welinder.)
+
+ * gtk/gtkaccelmap.c: Properly handle short returns from
+ write() calls. (Handling EINTR isn't enough... that only
+ handles the case where you were interrupted before you
+ wrote a single byte.)
+
+ * gdk/linux-fb/gdkmouse-fb.c gdk/linux-fb/gdkkeyboard-fb.c:
+ Robustify against short returns from write() calls.
+
Fri Mar 22 10:12:10 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_paint): Change
+Fri Mar 22 10:56:19 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkaccelmap.c (gtk_accel_map_save_fd): Fix memory
+ leak. (#74400, Morten Welinder.)
+
+ * gtk/gtkaccelmap.c: Properly handle short returns from
+ write() calls. (Handling EINTR isn't enough... that only
+ handles the case where you were interrupted before you
+ wrote a single byte.)
+
+ * gdk/linux-fb/gdkmouse-fb.c gdk/linux-fb/gdkkeyboard-fb.c:
+ Robustify against short returns from write() calls.
+
Fri Mar 22 10:12:10 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_paint): Change
+Fri Mar 22 10:56:19 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkaccelmap.c (gtk_accel_map_save_fd): Fix memory
+ leak. (#74400, Morten Welinder.)
+
+ * gtk/gtkaccelmap.c: Properly handle short returns from
+ write() calls. (Handling EINTR isn't enough... that only
+ handles the case where you were interrupted before you
+ wrote a single byte.)
+
+ * gdk/linux-fb/gdkmouse-fb.c gdk/linux-fb/gdkkeyboard-fb.c:
+ Robustify against short returns from write() calls.
+
Fri Mar 22 10:12:10 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_paint): Change
+Fri Mar 22 10:56:19 2002 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkaccelmap.c (gtk_accel_map_save_fd): Fix memory
+ leak. (#74400, Morten Welinder.)
+
+ * gtk/gtkaccelmap.c: Properly handle short returns from
+ write() calls. (Handling EINTR isn't enough... that only
+ handles the case where you were interrupted before you
+ wrote a single byte.)
+
+ * gdk/linux-fb/gdkmouse-fb.c gdk/linux-fb/gdkkeyboard-fb.c:
+ Robustify against short returns from write() calls.
+
Fri Mar 22 10:12:10 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_paint): Change
#include <gdk/gdkinternals.h>
#include "gdkkeysyms.h"
#include "gdkprivate-fb.h"
+#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
return TRUE;
}
+static gboolean
+write_string (gint fd,
+ gchar *str)
+{
+ gsize to_write = strlen (string);
+
+ while (to_write > 0)
+ {
+ gssize count = write (fd, str, to_write);
+ if (count < 0)
+ {
+ if (errno != EINTR)
+ return FALSE;
+ }
+ else
+ {
+ to_write -= count;
+ str += count;
+ }
+ }
+
+ return TRUE;
+}
+
static gboolean
xlate_open (GdkFBKeyboard *kb)
{
tcsetpgrp (gdk_display->tty_fd, getpgrp());
- write (gdk_display->tty_fd, cursoroff_str, strlen (cursoroff_str));
+ write_string (gdk_display->tty_fd, cursoroff_str);
ioctl (gdk_display->tty_fd, KDSKBMODE, K_XLATE);
struct termios ts;
const char cursoron_str[] = "\033c";
- write (gdk_display->tty_fd, cursoron_str, strlen (cursoron_str));
+ write_string (gdk_display->tty_fd, cursoron_str);
tcgetattr (gdk_display->tty_fd, &ts);
ts.c_lflag |= (ICANON|ECHO|ISIG);
tcsetpgrp (gdk_display->tty_fd, getpgrp());
- write (gdk_display->tty_fd, cursoroff_str, strlen (cursoroff_str));
+ write_string (gdk_display->tty_fd, cursoroff_str);
if (ioctl (gdk_display->tty_fd, KDSKBMODE, K_MEDIUMRAW) < 0)
{
struct termios ts;
const char cursoron_str[] = "\033c";
- write (gdk_display->tty_fd, cursoron_str, strlen (cursoron_str));
+ write_string (gdk_display->tty_fd, cursoron_str);
tcgetattr (gdk_display->tty_fd, &ts);
ts.c_lflag |= (ICANON|ECHO|ISIG);
return fd;
}
+static gboolean
+write_all (gint fd,
+ gchar *buf,
+ gsize to_write)
+{
+ while (to_write > 0)
+ {
+ gssize count = write (fd, buf, to_write);
+ if (count < 0)
+ {
+ if (errno != EINTR)
+ return FALSE;
+ }
+ else
+ {
+ to_write -= count;
+ buf += count;
+ }
+ }
+
+ return TRUE;
+}
+
static gboolean
gdk_fb_mouse_ps2_open (GdkFBMouse *mouse)
{
buf[i++] = 232; /* device resolution */
buf[i++] = 1;
- write (fd, buf, i);
+ if (!write_all (fd, buf, i))
+ {
+ close (fd);
+ return FALSE;
+ }
usleep (10000); /* sleep 10 ms, then read whatever junk we can get from the mouse, in a vain attempt
to get synchronized with the event stream */
tty.c_cc[VTIME] = 0;
tty.c_cc[VMIN] = 1;
tcsetattr (fd, TCSAFLUSH, &tty);
-
- write (fd, "*n", 2);
+
+ if (!write_all (fd, "*n", 2))
+ {
+ close (fd);
+ return FALSE;
+ }
mouse->fd = fd;
return TRUE;
#include "gtkwindow.h" /* in lack of GtkAcceleratable */
#include <string.h>
+#include <errno.h>
#include <fcntl.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
close (fd);
}
+static gboolean
+write_all (gint fd,
+ gchar *buf,
+ gsize to_write)
+{
+ while (to_write > 0)
+ {
+ gssize count = write (fd, buf, to_write);
+ if (count < 0)
+ {
+ if (errno != EINTR)
+ return FALSE;
+ }
+ else
+ {
+ to_write -= count;
+ buf += count;
+ }
+ }
+
+ return TRUE;
+}
+
static void
accel_map_print (gpointer data,
const gchar *accel_path,
gboolean changed)
{
GString *gstring = g_string_new (changed ? NULL : "; ");
- gint err, fd = GPOINTER_TO_INT (data);
+ gint fd = GPOINTER_TO_INT (data);
gchar *tmp, *name;
g_string_append (gstring, "(gtk_accel_path \"");
g_string_append (gstring, "\")\n");
- do
- err = write (fd, gstring->str, gstring->len);
- while (err < 0 && errno == EINTR);
+ write_all (fd, gstring->str, gstring->len);
g_string_free (gstring, TRUE);
}
gtk_accel_map_save_fd (gint fd)
{
GString *gstring;
- gint err;
g_return_if_fail (fd >= 0);
g_string_append (gstring, "; this file is an automated accelerator map dump\n");
g_string_append (gstring, ";\n");
- do
- err = write (fd, gstring->str, gstring->len);
- while (err < 0 && errno == EINTR);
+ write_all (fd, gstring->str, gstring->len);
+
+ g_string_free (gstring, TRUE);
gtk_accel_map_foreach (GINT_TO_POINTER (fd), accel_map_print);
}